# Ce qui suit un dièze n'est pas exécuté. On appelle ça un commentaire.
# Les trois commandes seront comprises par le code
10+2 [1] 12
10 + 2 [1] 12
10 + 2[1] 12
R est un langage de programmation open source spécialisé dans la statistique et l’analyse des données. Il a été créé pour fournir un environnement convivial pour la manipulation, l’analyse et la visualisation des données.Il existe d’autres langages de programmation comme Python, JavaScript, Java, C++, etc.
R est utilisé pour effectuer des opérations statistiques, faire de la modélisation, créer des graphiques et effectuer des analyses de données complexes.
R est extrêmement flexible et extensible grâce à des packages R, qui ajoutent des fonctionnalités supplémentaires.
RStudio est un environnement de développement intégré (IDE) conçu spécifiquement pour travailler avec le langage R. C’est un logiciel qui fournit une interface utilisateur plus conviviale pour écrire, exécuter et gérer des scripts R. Il existe d’autres IDE, comme Visual Studio Code ou Jupyter Notebook.
RStudio inclut un éditeur de texte avec coloration syntaxique, un gestionnaire de packages, des fenêtres pour l’affichage des graphiques et des données, et bien d’autres fonctionnalités pour améliorer la productivité des utilisateurs R.
En somme, R est le langage de programmation sous-jacent pour l’analyse des données, tandis que RStudio est un environnement de développement qui facilite l’utilisation de R.
Il existe de plusieurs ressources en français pour apprendre à coder sur R. Nous vous recommandons en particulier :
Les bonnes ressources anglophones gratuites sont très nombreuses et faciles à trouver sur Internet. Le grand classique est R for data science, de Grolemund et Wickham (2022). On se focalise ici avec deux autres qui sont le plus en lien avec nos sujets :
N’hésitez pas à chercher directement sur le Web en cas de problème. Vous serez souvent conduits vers les forums stackoverflow ou RStudio, qui sont aussi des ressources très précieuses pour résoudre des problèmes très spécifiques.
Pour un apprentissage interactif, vous pouvez également utiliser ChatGPT. Cet outil basé sur l’intelligence artificielle s’avère particulièrement utile pour les débutants qui ont besoin de support personnalisé ou pour les utilisateurs avancés comme assistant de programmation pour structurer des chaînes de traitement ou aider avec les problèmes les plus courants. Attention toutefois car il arrive régulièrement à ChatGPT “d’halluciner” des réponses lorsqu’il s’agit de questions très spécifiques.
Pour vous retrouver parmi la multitude de packages existants, il existe une ressource précieuse en ligne : CRAN Task View (https://cran.r-project.org/web/views/). Ce registre fournit des recommandations sur les packages présents sur CRAN adaptés à un sujet spécifique.
Il existe également de superbes cheat-sheet (“antisèches”) qui récapitulent les principales ressource :

A : fenêtre script/source B : console C : environnement D : explorateur
La fenêtre de script permet d’éditer les fichiers scripts en vue d’éxécuter le code.
La console est la fênetre où s’éxécute le code et où on peut directement taper des commandes. Il n’est pas obligatoire de passer par la fenêtre de script.
Le signe “>” dans votre console est appelé “invite de commande” ou “prompt”. C’est le symbole que la console utilise pour indiquer qu’elle est prête à recevoir des commandes ou des instructions de l’utilisateur. Une fois que vous voyez cet invite, vous pouvez commencer à entrer des commandes en utilisant le langage R. Après avoir entré une commande, vous appuyez sur Entrée pour l’exécuter.
L’environnement rassemble des fonctionnalités pour suivre le fonctionnement de R, en faisant notamment apparaître les différents objets générés par notre script.
L’explorateur permet de connaître les fichiers de notre ordinateur, de visualiser les rendus graphiques et cartographiqus, les différentes librairies et l’aide pour l’utilisation de ces dernières.
On se focalise ici sur quelques aspects qui peuvent être requis pour la manipulation du code et à la marge.
Lorsqu’on saisit une commande, que ce soit dans la console ou dans la fenêtre de script, les espaces autour des opérateurs n’ont pas d’importance.
Les trois commandes suivantes sont donc équivalentes, mais on privilégie en général la deuxième pour des raisons de lisibilité du code.
# Ce qui suit un dièze n'est pas exécuté. On appelle ça un commentaire.
# Les trois commandes seront comprises par le code
10+2 [1] 12
10 + 2 [1] 12
10 + 2[1] 12
Pour les opérations plus complexes, il faut veiller à utiliser les parenthèses, sinon les résultats ne seront pas corrects :
10 + 2 * 5 / 14 - 2 * 2 [1] 6.714286
#>[1] 6.714286
(10 + (2*5)) / (14 - (2 * 2)) [1] 2
Le signe <- correspond à l’assignation d’une valeur à une variable dont on choisit le nom.
# On commence par faire une opération simple
3 + 4[1] 7
# Ce qui équivaut à :
a <- 3
b <- 4
a + b[1] 7
# Et on peut également stocker le résultat dans une nouvelle variable
c <- a + b
c[1] 7
Du fait de l’assignation “<-”, les valeurs sont automatiquement associées à l’objet et ce dernier apparaît dans la fenêtre environnement.
De manière générale, vous allez retrouver dans cette fenêtre tous les objets que vous avez créés après éxécution du code : que ce soit de simples variables, des tableaux, des fonctions, des objets graphiques, etc.
Quand on assigne une nouvelle valeur à un objet déjà existant, la valeur précédente est perdue.
x <- 2
x <- 5
x[1] 5
#> [1] 5Les objets peuvent contenir tout un tas de données. Jusqu’ici on n’a stocké que des nombres, mais ils peuvent aussi contenir des chaînes de caractères (du texte), qu’on délimite avec des guillemets simples ou doubles (’ ou “) :
chien <- "Chihuahua"
chien[1] "Chihuahua"
#> [1] "Chihuahua"Ici la variable “chien” est un objet contenant une chaîne de caractères.
Un point important est relatif aux types des variables : numérique, catégorielles, textes, dates, spatiales… En général, les opérations ne peuvent concerner que des variables du même type. Les fonctions sont souvent contraignantes quant aux types des variables qu’elles prennent comme arguments.
# Exemple avec une variable numérique et une variable caractère
x <- 5
y <- "hello"
# Tentative d'addition de deux variables de types différents
#resultat <- x + yLes vecteurs permettent de stocker des informations de même nature dans un unique objet. Exemple :
# Si on continuait à créer des objets ponctuels :
taille1 <- 156
taille2 <- 164
taille3 <- 197
taille4 <- 147
taille5 <- 173
(taille1 + taille2 + taille3 + taille4 + taille5) / 5[1] 167.4
#> [1] 167.4Précédemment, nous avons stockés différentes valeurs chiffrées sous plusieurs objets qui apparaissent dans notre fenêtre d’environnement.
tailles <- c(156, 164, 197, 147, 173)
#> [1] 156 164 197 147 173Un vecteur dans R est un objet qui peut contenir plusieurs informations du même type, potentiellement en très grand nombre.
Ici la variable “tailles”est un vecteur contenant des valeurs chiffrées.
Ce qui est pratique avec les vecteurs, c’est qu’on peut alors leur appliquer des opérations qui s’appliqueront à l’ensemble des valeurs du vecteur.
# Si l'on souhaite mettre la taille en mètres :
tailles / 100 [1] 1.56 1.64 1.97 1.47 1.73
#> [1] 1.56 1.64 1.97 1.47 1.73
tailles_m <- tailles / 100
tailles_m[1] 1.56 1.64 1.97 1.47 1.73
#> [1] 1.56 1.64 1.97 1.47 1.73Cela s’applique à tous les tyoes d’opérations.
Sans créer de nouvel objet, ajouter 10 cm aux tailles en centimètres et multiplier au carré les tailles en mètres
tailles + 10[1] 166 174 207 157 183
#> [1] 166 174 207 157 183
tailles_m^2[1] 2.4336 2.6896 3.8809 2.1609 2.9929
#> [1] 2.4336 2.6896 3.8809 2.1609 2.9929On peut également appliquer des opérations spécifiques à chaque valeur à l’aide d’un autre vecteur :
# Création d'un nouveau vecteur avec l'âge
age <- c(52, 82, 19, 49, 29)En créant une nouvelle variable “age_tailles_m”, calculer le ratio de l’age par rapport à la taille en mètres
L’Indice de Masse Corporelle se calcule de la manière suivante:
\[ IMC = poids (kg) / (taille (m))²\]
En créant une nouvelle variable “imc”, calculez le ratio pour les 5 valeurs
tailles <- c(156, 164, 197, 147, 173)
poids <- c(45, 59, 110, 44, 88)Un data.frame est un tableau qui peut contenir différents types de données (nombres, chaînes de caractères, etc.) organisées en colonnes.
# On commence par créer les variables (les colonnes du tableau)
noms <- c("John", "Jack", "Cindy", "Samantha")
sexe <- c("homme", "homme", "femme", "femme")
ages <- c(42, 57, 24, NA)
poids <- c(87, 73, NA, NA)
tailles <- c(174, 198, 192, 164)
# On les rassemble dans un tableau
ma_table <- data.frame(noms, sexe, ages, poids, tailles)
ma_table noms sexe ages poids tailles
1 John homme 42 87 174
2 Jack homme 57 73 198
3 Cindy femme 24 NA 192
4 Samantha femme NA NA 164
Les noms d’objets peuvent contenir des lettres, des chiffres, les symboles . et _. Ils ne peuvent pas commencer par un chiffre. Attention, R fait la différence entre minuscules et majuscules dans les noms d’objets, ce qui signifie que x et X seront deux objets différents, tout comme resultat et Resultat.
De manière générale, il est préférable d’éviter les majuscules (pour les risques d’erreur) et les caractères accentués (pour des questions d’encodage) dans les noms d’objets.
De même, il faut essayer de trouver un équilibre entre clarté du nom (comprendre à quoi sert l’objet, ce qu’il contient) et sa longueur. Par exemple, on préfèrera comme nom d’objet taille_conj1 à taille_du_conjoint_numero_1 (trop long) ou à t1 (pas assez)
R est constitué de fonctions. De nombreuses fonctions prédéfinies sont contenues dans la base de R ou dans des packages qu’on ajoute (que l’on verra plus tard). La meilleure manière de comprendre ce qu’est une fonction est d’en créer une soi même.
# On crée une fonction "ajoute" qui prend deux paramètres.
# x est un premier et y est celui qu'on ajoute
ajoute <- function(x, y) {
x + y
}
# On peut maintenant utiliser cette fonction
ajoute(3, 4)[1] 7
# On peut effectuer les mêmes opérations. Les valeurs a et b sont encore
# en mémoire, donc on peut faire :
ajoute(a, b)[1] 7
c <- ajoute(a, b)
c[1] 7
ajoute(c, a)[1] 10
Lorsque vous téléchargez un package (ou librairie), ce dernier charge en réalité un éventail de fonctions que vous pouvez explorer via l’aide.
# la fonction sum() est une fonction de base de R, mais d'autres opérations plus complexes sous enregistrées dans des packages spécifiques
sum(a,b)[1] 7
Exercice : rendre lisible le code ci-dessous
x <- 5*(3+2)-1
if(x%%2==0) {print('Pair')} else{print('Impair')}[1] "Pair"
for(i in 1:10) {if(i%%2 == 0) {print(paste('Nombre pair :', i))} else{print(paste('Nombre impair :', i))}}[1] "Nombre impair : 1"
[1] "Nombre pair : 2"
[1] "Nombre impair : 3"
[1] "Nombre pair : 4"
[1] "Nombre impair : 5"
[1] "Nombre pair : 6"
[1] "Nombre impair : 7"
[1] "Nombre pair : 8"
[1] "Nombre impair : 9"
[1] "Nombre pair : 10"
Les valeurs manquantes sont fréquentes dans les jeux de données. Elles notées NA dans R (certaines peuvent avoir pour valeur NaN). On utilise la fonction na.rm= TRUE pour les éluder dans les opérations simples.
# On peut reprendre le jeu de données ma_table
# On peut faire une moyenne sur les tailles car on a toutes les variables
mean(ma_table$tailles)[1] 182
sum(ma_table$tailles)[1] 728
# Mais la moyenne ne fonctionne pas immédiatement sur les poids ou les âges
# car il manque des variables
mean(ma_table$ages)[1] NA
sum(ma_table$poids)[1] NA
# Pour que cela fonctionne, il faut spécifier quoi faire des valeurs manquantes
# en indiquant na.rm = TRUE (NA pour "non-available" et RM pour "remove")
mean(ma_table$ages, na.rm = TRUE)[1] 41
sum(ma_table$poids, na.rm = TRUE)[1] 160
Les librairies R sont communément appelées “packages”. Plusieurs packages R sont utilisées pour ce projet. Les packages dans R sont des extensions de logiciels qui ajoutent des fonctionnalités spécifiques au langage R de base.
Ils sont conçus pour faciliter l’analyse de données, la visualisation, la modélisation statistique, et bien plus encore. Les packages sont comme des boîtes à outils virtuelles qui permettent aux utilisateurs d’effectuer des tâches analytiques avancées sans avoir à réinventer la roue à chaque fois. Ils permettent de gagner du temps et de se concentrer sur la résolution de problèmes spécifiques à son domaine d’étude, au lieu de vous soucier de la programmation de fonctions de base.
Lors de la rédaction de publications scientifiques, il est important de citer correctement les packages R utilisés dans votre analyse. Assurez-vous d’inclure le nom complet du package ainsi que le nom de son auteur ou des auteurs. Zotero et RStudio permettent aisément d’inclure ces citations dans votre analyse.
Les autres packages mobilisés dans pour ce cours sont listés dans le bloc de code ci-dessous :
library("tidyverse") # Une série de packages pour faciliter la manipulation de données── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.1 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.1
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("readxl") # Pour lire les fichiers excel (Carvalho et al. 2018)
library("gt") # Pour des rendus graphiques harmonisés html et pdf/LaTeX
library("wdpar") # Pour télécharger simplement la base d'aires protégées WDPALoading required package: sf
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE
Le “tidyverse” st un ensemble cohérent de packages R conçus pour la manipulation, la visualisation et l’analyse de données de manière cohérente et efficace. Il a été développé pour simplifier le flux de travail de l’analyse de données et pour rendre le code plus lisible et plus facile à comprendre.
Le signe %>% est un “tuyau”. On peut le lire à haute voix comme “ensuite”. Par exemple :
library(tidyverse)
d <- a %>%
ajoute(b) %>%
ajoute(c)Le “tidyverse” comprend plusieurs packages populaires, et notamment,dplyr. Ce dernier est très utile pour épurer les données lorsque vous travaillez sur des tableaux (et donc sur des tables attributaires).
Il est utilisé pour la manipulation de données, notamment le filtrage, la sélection, le regroupement et la création de nouvelles variables.
# Un exemple qui combine ces opérations
ma_table %>%
filter(!is.na(ages)) noms sexe ages poids tailles
1 John homme 42 87 174
2 Jack homme 57 73 198
3 Cindy femme 24 NA 192
#consulter la sortie de l'objet
ma_table %>%
filter(!is.na(ages)) %>%
select(sexe, ages, tailles, poids) sexe ages tailles poids
1 homme 42 174 87
2 homme 57 198 73
3 femme 24 192 NA
ma_table %>%
filter(!is.na(ages)) %>%
select(sexe, ages, tailles, poids) %>%
group_by(sexe) %>%
summarise(nb_pers = n())# A tibble: 2 × 2
sexe nb_pers
<chr> <int>
1 femme 1
2 homme 2
ma_table %>%
filter(!is.na(ages)) %>%
select(sexe, ages, tailles, poids) %>%
group_by(sexe) %>%
summarise(nb_pers = n(),
somme_poids = sum(poids, na.rm = TRUE),
taille_max = max(tailles, na.rm = TRUE),
age_moy = mean(ages, na.rm = TRUE))# A tibble: 2 × 5
sexe nb_pers somme_poids taille_max age_moy
<chr> <int> <dbl> <dbl> <dbl>
1 femme 1 0 192 24
2 homme 2 160 198 49.5
# > A tibble : 2 x 5
# sexe nb_pers somme_poids taille_max age_moy
# <chr> <int> <dbl> <dbl> <dbl>
# 1 femme 1 0 192 24
# 2 homme 2 160 198 49.5Voici certaines de fonctions fondamentales du dplyr : - select : choisir des colonnes - filter : choisir des lignes - mutate : modifier des valeurs - group_by : variables pour des tris - summarise : créer des filtres
Exercice en groupe : à partir du tableau ventes_magasin, utiliser les fonctions précédentes et le pipe operator pour réaliser les opérations suivantes :
Sélectionnez uniquement les colonnes produit, quantite, et prix_unitaire du data frame ventes_magasin.
Ne conservez que les ventes où la quantité vendue est supérieure à 5 unités.
Ajoutez une nouvelle colonne nommée montant qui représente le montant total de chaque vente (quantité multipliée par le prix unitaire) et ajoutez-la au data frame.
Créez un nouveau tableau ventes_par_produit, regroupez les données par produit pour calculer la quantité totale vendue de chaque produit.
Complétez ce tableau avec le montant total et le nombre de ventes.
# Création du data frame ventes_magasin
ventes_magasin <- data.frame(
produit = c("Produit A", "Produit B", "Produit A", "Produit C", "Produit B",
"Produit A", "Produit C", "Produit B", "Produit A"),
quantite = c(8, 4, 12, 6, 7, 9, 3, 11, 5),
prix_unitaire = c(10, 15, 8, 12, 20, 10, 18, 14, 9),
date_vente = ymd( # Cette fonction interprète des dates year-month-day
c("2023-01-05", "2023-01-08", "2023-01-09", "2023-01-10", "2023-01-15",
"2023-01-20", "2023-01-25", "2023-01-30", "2023-02-02"))
)Jointures : fusionner deux tableaux par une variable d’identification (“clé”)
# Tableau clients
clients <- data.frame(ID = c(1, 2, 3, 4),
nom_client = c("Alice", "Bob", "Charlie", "David"))
# Tableau commandes
commandes <- data.frame(ID = c(2, 3, 1, 4),
montant = c(100, 150, 50, 200))
# Jointure par ID
resultat <- inner_join(clients, commandes, by = "ID")Cette opération exige toutefois que la variable d’identification soit écrite de manière identique dans les deux jeux de données.
Supposons que l’on travaille sur les aires protégées à Madagascar et que l’on dispose de deux jeux de données provenant de sources différentes. On a alors des informations complémentaires que l’on souhaite fusionner en un seul tableau via le nom de l’aire protégée.
Il faudra veiller à ce que les noms aient la même écriture (pas de différences avec des majuscules, des abréviations ou des noms raccourcis)
En très bref :
Concernant les données d’aires protégées importées :
Les études sur les aires protégées s’appuient fréquemment sur la base WDPA (World Database on Protected Area), consultable en ligne sur https://protectedplanet.net.
La base rassemblée par l’association Vahatra dans le cadre de la monographie qu’elle a coordonnée sur l’ensemble des aires protégées terrestres malgaches semble beaucoup plus fiable (Goodman et al. 2018). Les données en question sont disponibles sur le portail https://protectedareas.mg avec une licence creative commons (CC-BY).
On va désormais importer les données avec l’information géographique :
# On travaille maintenant le fichier excel
AP_Vahatra <- read_xlsx("data/AP_Vahatra.xlsx")
# On fait apparaître le nom des colonnes
colnames(AP_Vahatra) [1] "nom" "cat_iucn" "creation"
[4] "date_creation" "date_modification" "mention_changement"
[7] "hectares" "num_atlas_" "full_name"
[10] "province" "region" "district"
[13] "gest_1" "gest_2" "type_ap"
[16] "an_creation" "nom_wdpa" "geometry"
[19] "rownum"
# On fait apparaître le nom des différentes aires protégées et leur catégorie IUCN
AP_Vahatra %>%
select(nom, cat_iucn) %>%
filter(row_number() <= 10)# A tibble: 10 × 2
nom cat_iucn
<chr> <chr>
1 Agnakatrika VI
2 Agnalazaha VI
3 Ambatofotsy V
4 Ambatotsirongorongo V
5 Ambatovaky IV
6 Ambohidray <NA>
7 Ambohijanahary IV
8 Ambohitantely IV
9 Ambohitr'Antsingy Montagne des Français V
10 Amoron'i Onilahy V
# On fait apparaître le nom des parcs nationaux
liste_PN <- AP_Vahatra %>%
filter(cat_iucn == "II") %>%
select(nom)
# Création d'une colonne pour la superficie en km²
AP_Vahatra <- AP_Vahatra %>%
mutate(superficie_km2 = hectares * 0.01)
# Tri des données de manière décroissante en fonction de la superficie en km²
AP_Vahatra <- AP_Vahatra %>%
arrange(desc(superficie_km2))
# Obtenir les 3 plus grandes aires protégées
AP_Vahatra %>%
slice_head(n = 3) %>%
select(nom)# A tibble: 3 × 1
nom
<chr>
1 Complexe Zones Humides Mangoky Ihotry
2 Makira
3 Corridor Ankeniheny Zahamena
# Obtenir la superficie totale de toutes les aires protégées
AP_Vahatra %>%
summarise(sum(AP_Vahatra$superficie_km2))# A tibble: 1 × 1
`sum(AP_Vahatra$superficie_km2)`
<dbl>
1 63725.
# Résumé statistique des superficies en km²
summary(AP_Vahatra$superficie_km2) Min. 1st Qu. Median Mean 3rd Qu. Max.
2.249 46.061 249.625 650.253 758.975 4265.942
# Aires protégées de superficie supérieure ou égale au 3ème quartile
AP_Vahatra %>%
filter(superficie_km2 >= 758.975) %>%
nrow()[1] 25
Exercice : quelles aires protégées ont été créées après 2000 et dont la gestion est assurée par l’Etat ? # Production d’un joli tableau synthétique
La fonction gt() permet d’obtenir des tableaux bien formatés. Si vous vous intéressez aux catégories IUCN et à leur superficie totale sur l’ensemble des aires protégées :
# Calcul des superficies totales pour chaque catégorie IUCN
AP_Vahatra_iucn <- AP_Vahatra %>%
filter(!is.na(cat_iucn)) %>%
group_by(cat_iucn) %>%
summarise(superficie_totale = sum(superficie_km2))
# Production du tableau
AP_Vahatra_iucn %>%
gt() %>%
cols_label(cat_iucn = "Catégorie IUCN",
superficie_totale = "Superficie totale (km²)") %>%
tab_header(
title = "Aires protégées de Madagascar : superficies par catégorie IUCN") %>%
tab_source_note("Source : données de l'association Vahatra") %>%
fmt_number(decimals = 2)| Aires protégées de Madagascar : superficies par catégorie IUCN | |
|---|---|
| Catégorie IUCN | Superficie totale (km²) |
| I | 22.40 |
| II | 25,380.56 |
| III | 44.17 |
| IV | 4,138.88 |
| V | 22,752.70 |
| VI | 8,265.72 |
| Source : données de l'association Vahatra | |
Avant de créer le graphique en nuages de points, nous devons préparer un tableau qui résume la superficie cumulée des aires protégées en fonction de leur année de création.
AP_superficie_annees <- AP_Vahatra %>%
group_by(an_creation) %>%
summarise(superficie_annuelle = sum(superficie_km2, na.rm = TRUE)) %>%
arrange(an_creation) %>%
mutate(superficie_cumulée = cumsum(superficie_annuelle))Créer un tableau pour représenter cette donnée de manière élégante
On cherche à décrire la dynamique de création d’aires protégées en termes de superficie. L’objectif est d’obtenir un graphique en nuages de points avec, pour chaque année de création, la superficie totale d’aires protégées.
Exercice de groupe : réfléchir à un tableau nommé “AP_superficie_annees” qui se base sur le jeu de données AP_Vahatra et qui pourrait alimenter le graphique en nuages de points. Utiliser la fonction cumsum()
Une fois le tableau AP_superficie_annees créé, vous pouvez éxecuter le code suivant :
# Graphique en nuages de points
ggplot(data = AP_superficie_annees, aes(x = an_creation, y = superficie_cumulée)) +
geom_point() +
geom_line() +
labs(x = "Année", y = "Superficie cumulée (km²)") +
ggtitle("Superficie cumulée en fonction de l'année de création") +
theme_minimal()
Avant de télécharger depuis le web les données du WDPA, nous pouvons directement travailler sur la table attributaire (fichier Excel)
library(wdpar)
# On regarde si les données WDPA sont disponibles sur l'ordinateur qui exécute
if (file.exists("data/WDPA_Oct2024_MDG-shapefile.zip")) {
# Si oui, on charge
WDPA_Mada <- wdpa_read("data/WDPA_Oct2024_MDG-shapefile.zip")
} else {
# Si non, on télécharge depuis protectedplanet
WDPA_Mada <- wdpa_fetch("Madagascar",
download_dir = "data")
}Exercice : comment auriez-vous comparer vos jeux de données Vahatra et WDPA_Mada ?
On peut déjà comparer le nombre d’aires protégées.
# Comparaison nombres d'aires protégées Vahatra et WDPA
AP_Vahatra %>%
distinct(nom) %>%
nrow()[1] 98
WDPA_Mada %>%
distinct(NAME) %>%
nrow()[1] 167
On peut comparer les différences de dates et de statut.
# Tout d'abord, on ne garde que les aires de WDPA qui apparaissent dans Vahatra
WDPA_commun <- WDPA_Mada %>%
filter(NAME %in% AP_Vahatra$nom_wdpa) %>%
filter(!(NAME == "Analalava" & IUCN_CAT == "Not Reported")) %>%
filter(!(NAME == "Site Bioculturel d'Antrema" & IUCN_CAT == "Not Reported")) %>%
filter(DESIG != "UNESCO-MAB Biosphere Reserve") %>%
arrange(NAME) %>%
mutate(rownum = row_number())
# On garde seulement les métadonnées que l'on veut comparer
WDPA_a_comparer <- WDPA_commun %>% # On repart des AP communes
select(nom_wdpa = NAME, type_wdpa = INT_CRIT, cat_iucn_wdpa = IUCN_CAT,
year_wdpa = STATUS_YR) # On ne garde que les colonnes à comparer
verif_meta_wdpa <-AP_Vahatra %>%
st_drop_geometry() %>% # Pas besoin d'un jeu spatial
select(nom:date_modification, nom_wdpa) %>% # colonnes à garder dans Vahatra
# On renomme la catégorie IUCN de Vahatra et on code les NA comme dans WDPA
mutate(cat_iucn = ifelse(is.na(cat_iucn), "Not Reported", cat_iucn)) %>%
left_join(WDPA_a_comparer, by = "nom_wdpa") %>% # On rassemble Vahatra et WDPA
# On compare les dates et statuts
mutate(`Différence de date` = year(date_creation) != year_wdpa,
`Différence de statut` = cat_iucn != cat_iucn_wdpa)
verif_meta_wdpa %>%
summarise(`Nombre d'aires protégées comparées` = n(),
`Différence de date` = sum(`Différence de date`),
`Différence de statut` = sum(`Différence de statut`)) %>%
gt() %>%
tab_header(title = paste("Différences entre les données de WDPA et celles de",
"l'assciation Vahatra sur les aires protégées terrestres",
"à Madagascar"))| Différences entre les données de WDPA et celles de l'assciation Vahatra sur les aires protégées terrestres à Madagascar | ||
|---|---|---|
| Nombre d'aires protégées comparées | Différence de date | Différence de statut |
| 98 | 68 | 40 |
On va cette fois-ci importer les données avec l’information géographique :
# On importe dans R en pointant vers le fichier .geojson
AP_Vahatra <- st_read("data/AP_Vahatra.geojson") Reading layer `AP_Vahatra' from data source
`/tmp/RtmpBi5ZF3/file119547dbbf4f/data/AP_Vahatra.geojson'
using driver `GeoJSON'
Simple feature collection with 98 features and 16 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: 43.25742 ymin: -25.60502 xmax: 50.47724 ymax: -11.98301
Geodetic CRS: WGS 84
library(geodata)Loading required package: terra
terra 1.7.78
Attaching package: 'terra'
The following object is masked from 'package:tidyr':
extract
# On enregistre les limites communales
contour_mada <- gadm(country = "Madagascar", resolution = 1, level = 3,
path = "data/GADM") %>%
st_as_sf()
# On enregistre contour_mada pour s'en servir par la suite
save(contour_mada, file = "data/contour_mada.rds")Le Système de Coordonnées de Référence (SCR) est un élément fondamental lors du travail avec des données géospatiales.
C’est un ensemble de conventions qui spécifie comment les coordonnées géodésiques (latitude, longitude, altitude) sont représentées et mesurées sur un plan cartographique (une carte, un système de coordonnées projetées).
Les SCR sont basés sur un système de référence géodésique, mais ils introduisent des transformations et des projections pour représenter les coordonnées de manière plus pratique sur une surface plane. Un SCR est défini par la forme de l’ellipsoïde, l’origine du système de coordonnées et l’orientation de ses axes par rapport à l’ellipsoïde.
Par exemple, pour le système de référence WGS84, l’origine du WGS 84 (World Geodetic System 1984) est située à l’intersection de l’équateur (latitude 0 degrés) et du méridien de Greenwich (longitude 0 degrés)

De nombreux pays et organisations ont leurs propres systèmes de référence géodésique, (ci-dessous un exemple) mais il existe également des systèmes de référence géodésique mondiaux, tels que le WGS 84 (World Geodetic System 1984), qui servent de norme internationale pour la cartographie et la géolocalisation.
Il faut veiller à ce que nos systèmes de coordonnées de références. La fonction st_crs() fait partie du package sf()et permet de vérifier ce dernier.
# On fait un point sur nos trois jeux de données
st_crs(contour_mada) # WGS 84, EPSG:4326Coordinate Reference System:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
st_crs(WDPA_Mada) # WGS 84, EPSG:4326 Coordinate Reference System:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["latitude",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["longitude",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
st_crs(AP_Vahatra) # WGS 84, EPSG:4326 Coordinate Reference System:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["geodetic latitude (Lat)",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["geodetic longitude (Lon)",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
# | tbl-cap: "Caractéristiques spatiales des données d'aires protégées WDPA du Sénégal"
# On crée une colonne pour connaître la géométrie de chaque observation (mutate)
# On trie les données en fonction de leur géométrie (group_by)
# On résume l'effectif total pour chaque catégorie de géométrie (summarise).
WDPA_Mada %>%
mutate(geom_type = st_geometry_type(.)) %>%
group_by(geom_type) %>%
summarise(n = n()) %>%
st_drop_geometry() %>%
gt() | geom_type | n |
|---|---|
| MULTIPOINT | 8 |
| MULTIPOLYGON | 163 |
library(tmap)Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
remotes::install_github('r-tmap/tmap')
# On fait une carte pour visualiser la donnée géographique
tmap_mode("view") # En mode interactiftmap mode set to interactive viewing
tm_shape(contour_mada) +
tm_borders() +
tm_shape(AP_Vahatra) +
tm_polygons(col = "cat_iucn", alpha = 0.6, title = "Catégorie IUCN",
id = "nom",
popup.vars = c("Acte de création" = "creation",
"Année de création" = "an_creation",
"Surface (ha)" = "hectares",
"Nom" = "nom",
"Gestionnaire" = "gest_1")) +
tmap_options(check.and.fix = TRUE)